package others;

import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;

public class Test15 {
    /**
     * 三数和
     * 给你一个包含 n 个整数的数组nums，判断nums中是否存在三个元素 a，b，c ，使得a + b + c = 0 ？请你找出所有和为 0 且不重复的三元组。
     * <p>
     * 注意：答案中不可以包含重复的三元组。
     * <p>
     * 输入：nums = [-1,0,1,2,-1,-4]
     * 输出：[[-1,-1,2],[-1,0,1]]
     */
    public static List<List<Integer>> findTriplet(int nums[]) {

        List<List<Integer>> lists = new ArrayList<>();

        Arrays.sort(nums);

        int len = nums.length;
        if(nums == null || len == 0){
            return lists;
        }
        for (int i = 0; i < len; i++) {
            if(nums[i] >= 0){
                return lists;
            }
            //去重
            if(i > 0 && nums[i] == nums[i-1]){
                continue;
            }
            int left = i + 1;
            int right = len - 1;

            while(right > left){
                int sum = nums[i] + nums[right] + nums[left];
                if (sum == 0){
                    lists.add(Arrays.asList(nums[i], nums[left], nums[right]));
                    //去重
                    while(right > left && nums[left] == nums[left+1]){++left;}
                    while(right > left && nums[right] == nums[right-1]){--right;}

                    ++left;--right;

                }else if(sum > 0){
                    --right;

                }else if(sum < 0){
                    ++left;
                }
            }
        }
        return lists;
    }

    public static void main(String[] args) {
        int[] targetArr = {-1, 0, 1, 2, -1, -4};
        List<List<Integer>> triplet = findTriplet(targetArr);
        System.out.println(triplet);

        Test15 t1 = new Test15();
        Test15 t2 = new Test15();
        Test15 t3 = new Test15();

        System.out.println(t1.hashCode());
        System.out.println(t2.hashCode());
        System.out.println(t3.hashCode());

        System.out.println(t1.getClass());
        System.out.println(t2.getClass());
        System.out.println(t3.getClass());

        System.out.println("t1得class得类加载器" + t1.getClass().getClassLoader());//sun.misc.Launcher$AppClassLoader@18b4aac2
        //sun.misc.Launcher$ExtClassLoader@1540e19d  jre1.8.0_321\lib\ext
        System.out.println("t1得class得类加载器得父类" + t1.getClass().getClassLoader().getParent());
        //null rt.jar(root)
        System.out.println("t1得class得类加载器得父类得父类" + t1.getClass().getClassLoader().getParent().getParent());

        //双亲委派机制：
        //1.AppClassLoader 2.ExtClassLoader 3.bootstrapLoader(最终执行rt.jar包里得 若boot没有去ext下找，没有去app下找 比如java.lang.String
        // 直接写一个这样得类会报没有main方法错)
        //具体类加载器收到类加载得请求 汇报给领导app- ext- root 大领导root知道后 自己没有这个东西 给ext ext也没有给app

    }


}
